home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
LANG
/
C
/
LIB
/
UNIXLIB37B
/
!UnixLib37
/
src
/
signal
/
s
/
sigexec
< prev
Wrap
Text File
|
1996-11-09
|
3KB
|
100 lines
;----------------------------------------------------------------------------
;
; $Source: /unixb/home/unixlib/source/unixlib37/src/signal/s/RCS/sigexec,v $
; $Date: 1996/11/06 22:01:42 $
; $Revision: 1.2 $
; $State: Rel $
; $Author: unixlib $
;
; $Log: sigexec,v $
; Revision 1.2 1996/11/06 22:01:42 unixlib
; Yet more changes by NB, PB and SC.
;
; Revision 1.1 1996/10/30 21:57:16 unixlib
; Initial revision
;
;----------------------------------------------------------------------------
; signal.s.sigexec: Written by Nick Burrett, 1 September 1996.
GET Unix37:unixlib.s.asm_dec
AREA |C$$code|,CODE,READONLY
; Low level functions used to setup stack frames and call the
; signal handler. These are called by __unixlib_setup_sighandler.
EXPORT |__unixlib_exec_sig|
; Setup a signal handler to execute on the current stack.
|__unixlib_exec_sig|
MOV ip, sp
STMFD sp!, {v1, v2, v3, v4, v5, v6, fp, ip, lr, pc}
SUB fp, ip, #4
; Call the signal handler
MOV a3, a1
MOV a1, a2
MOV lr, pc
MOV pc, a3
LDMEA fp, {v1, v2, v3, v4, v5, v6, fp, sp, pc}^
EXPORT |__unixlib_exec_sigstack|
; Execute a signal handler on an alternative stack
; (sigaltstack for POSIX).
|__unixlib_exec_sigstack|
STMFD sp!, {a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, lr}
; Preserve sp
MOV v1, sp
; Switch to the signal stack, setting it up for a proper
; APCS stack frame.
MOV fp, #0
ADD sp, a1, a2
; Pad the stack chunk limit in case we run out of room.
ADD sl, a1, #512
; Call the signal handler
MOV a1, a4
MOV lr, pc
MOV pc, a3
MOV sp, v1
LDMFD sp!, {a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, pc}^
EXPORT |__unixlib_exec_sigstack_bsd|
; Execute a signal handler on an alternative stack
; (sigstack for BSD).
|__unixlib_exec_sigstack_bsd|
STMFD sp!, {a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, lr}
; Preserve sp
MOV v1, sp
; Switch to the signal stack, setting it up for a proper
; APCS stack frame.
MOV fp, #0
MOV sp, a1
; Under BSD, we don't know the size of the signal stack. Let's
; make up a value and hope for the best.
SUB sl, sp, #16384
; Call the signal handler
MOV a1, a3
MOV lr, pc
MOV pc, a2
MOV sp, v1
LDMFD sp!, {a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, pc}^
EXPORT |__unixlib_exec_sig_interrupt|
IMPORT raise
; Execute a signal handler on the current stack. This would be
; used where the operating system has caused the signal
|__unixlib_exec_sig_interrupt|
STMFD sp!, {a2, a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, lr}
; Preserve sp
MOV v1, sp
; Pretend to have a fresh stack frame
MOV fp, #0
; Pad the stack chunk limit in case we run out of room.
SUB sl, sp, #512
; Raise the signal
BL raise
MOV sp, v1
LDMFD sp!, {a2, a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, pc}^
END